#ifndef __XL9555_H
#define __XL9555_H

#include "driver/gpio.h"
#include "esp_err.h"
#include "driver/i2c_master.h"


/* XL9555命令宏 */
#define XL9555_INPUT_PORT0_REG      0                               /* 输入寄存器0地址 */
#define XL9555_INPUT_PORT1_REG      1                               /* 输入寄存器1地址 */
#define XL9555_OUTPUT_PORT0_REG     2                               /* 输出寄存器0地址 */
#define XL9555_OUTPUT_PORT1_REG     3                               /* 输出寄存器1地址 */
#define XL9555_INVERSION_PORT0_REG  4                               /* 极性反转寄存器0地址 */
#define XL9555_INVERSION_PORT1_REG  5                               /* 极性反转寄存器1地址 */
#define XL9555_CONFIG_PORT0_REG     6                               /* 方向配置寄存器0地址 */
#define XL9555_CONFIG_PORT1_REG     7                               /* 方向配置寄存器1地址 */

#define XL9555_ADDR                 0x20                            /* XL9555地址(左移了一位)-->请看手册（9.1. Device Address） */

/* XL9555各个IO的功能 */
#define IO0_0                       0x0001
#define IO0_1                       0x0002
#define IO0_2                       0x0004
#define IO0_3                       0x0008
#define IO0_4                       0x0010
#define IO0_5                       0x0020
#define IO0_6                       0x0040
#define IO0_7                       0x0080
#define IO1_0                       0x0100
#define IO1_1                       0x0200
#define IO1_2                       0x0400
#define IO1_3                       0x0800
#define IO1_4                       0x1000
#define IO1_5                       0x2000
#define IO1_6                       0x4000
#define IO1_7                       0x8000

typedef void(*xl9555_input_cb_t)(int io_num);

/* 函数声明 */
/* 初始化XL9555 */
void xl9555_init(i2c_master_bus_handle_t bus_handle,gpio_num_t int_io,xl9555_input_cb_t f);
int xl9555_pin_read(uint16_t pin);                                  /* 获取某个IO状态 */
uint16_t xl9555_pin_write(uint16_t pin, int val);                   /* 控制某个IO的电平 */
esp_err_t xl9555_read_byte(uint8_t* data, size_t len);              /* 读取XL9555的16位IO值 */
void xl9555_ioconfig(uint16_t config_value);
#endif
